void ReadImage(fname, fimage, M, N, Q)
char fname[200]; 
int ***fimage;
int *M, *N, *Q;
{
 int i,j;
 unsigned char  *image;
 char header [100], *ptr;
 FILE  *fd;

 if ((fd=fopen(fname,"r")) == NULL) {
   fprintf(stderr,"Can't open %s.\n",fname);
   exit(1);
 }

  fgets(header,100,fd);
  if ( (header[0]!=80) ||    /* 'P' */
       (header[1]!=53) ) {   /* '5' */
       fprintf(stderr,"Image %s is not PGM.\n",fname);
       exit(1);
  }

  fgets(header,100,fd);
  while(header[0]=='#')
    fgets(header,100,fd);
 
  *M=strtol(header,&ptr,0);
  *N=atoi(ptr);
 
  fgets(header,100,fd);

  *Q=strtol(header,&ptr,0);

  image = (unsigned char *) malloc( ((*M)*(*N)) * sizeof(unsigned char));

  *fimage=(int **)malloc( (*N) * sizeof(int *));
  for(i=0; i < (*N); i++)
    (*fimage)[i]=(int *)malloc( (*M) * sizeof(int));

  if (fread(image, (*M)*(*N), 1, fd) == 0) {
    fprintf(stderr,"Image %s is wrong size.\n",fname);
    exit(1);
  }

  /* Convert the unsigned characters to integers */

  for(i=0; i < (*N); i++)
   for(j=0; j < (*M); j++)
     (*fimage)[i][j]=(int)image[i*(*M)+j];

  free(image);

  fclose(fd);

}
